home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm2.lha / SORGENTI4 / LEZIONE8e.s / LEZIONE8e.s
Text File  |  1995-08-05  |  11KB  |  377 lines

  1.  
  2. ; Una routine di FADE (ossia dissolvenza) con una modifica riguardante il mix
  3. ; dei colori, infatti si puo' indicare una sfumatura RGB verso la quale
  4. ; tendere. Premere il tasto sinistro e destro varie volte per vedere e uscire.
  5.  
  6.     SECTION    Fade1,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup1.s"    ; Salva Copperlist Etc.
  12. *****************************************************************************
  13.  
  14.         ;5432109876543210
  15. DMASET    EQU    %1000001110000000    ; solo copper e bitplane DMA
  16. ;         -----a-bcdefghij
  17.  
  18. ;    a: Blitter Nasty
  19. ;    b: Bitplane DMA       (Se non e' settato, spariscono anche gli sprite)
  20. ;    c: Copper DMA
  21. ;    d: Blitter DMA
  22. ;    e: Sprite DMA
  23. ;    f: Disk DMA
  24. ;    g-j: Audio 3-0 DMA
  25.  
  26. START:
  27. ;    puntiamo la figura
  28.  
  29.     MOVE.L    #Logo1,d0    ; dove puntare
  30.     LEA    BPLPOINTERS,A1    ; puntatori COP
  31.     MOVEQ    #4-1,D1        ; numero di bitplanes (qua sono 4)
  32. POINTBP:
  33.     move.w    d0,6(a1)
  34.     swap    d0
  35.     move.w    d0,2(a1)
  36.     swap    d0
  37.     ADD.L    #40*84,d0    ; + lunghezza bitplane (qua e' alto 84 linee)
  38.     addq.w    #8,a1
  39.     dbra    d1,POINTBP
  40.  
  41.  
  42.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  43.                     ; e sprites.
  44.  
  45.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  46.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  47.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  48.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  49.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  50.  
  51.  
  52. mouse1:
  53.     btst    #6,$bfe001    ; mouse premuto?
  54.     bne.s    mouse1
  55.  
  56. ;    ****************+ parte 1 con tendenza al ROSSO *****************
  57.  
  58.     clr.w    FaseDelFade    ; azzera il numero del fotogramma
  59.     move.w    #$b12,Tendenza    ; imposta la tendenza al rosso ******
  60.  
  61. mouse2:
  62.     CMP.b    #$ff,$dff006    ; linea 255
  63.     bne.s    mouse2
  64. Aspetta1:
  65.     CMP.b    #$ff,$dff006    ; linea 255
  66.     beq.s    Aspetta1
  67.  
  68.     bsr.w    FadeIN        ; Fade!!!
  69.  
  70.     btst    #2,$dff016    ; mouse premuto?
  71.     bne.s    mouse2
  72.  
  73.     move.w    #16,FaseDelFade    ; parti dal fotogramma 16
  74.  
  75. mouse3:
  76.     CMP.b    #$ff,$dff006    ; linea 255
  77.     bne.s    mouse3
  78. Aspetta2:
  79.     CMP.b    #$ff,$dff006    ; linea 255
  80.     beq.s    Aspetta2
  81.  
  82.     bsr.w    FadeOUT    ; Fade!!!
  83.  
  84.     btst    #6,$bfe001    ; mouse premuto?
  85.     bne.s    mouse3
  86.  
  87. ;    ****************+ parte 2 con tendenza al VERDE *****************
  88.  
  89.     clr.w    FaseDelFade    ; azzera il numero del fotogramma
  90.     move.w    #$373,Tendenza    ; imposta la tendenza al verde ******
  91.  
  92. mouse2x:
  93.     CMP.b    #$ff,$dff006    ; linea 255
  94.     bne.s    mouse2x
  95. Aspetta1x:
  96.     CMP.b    #$ff,$dff006    ; linea 255
  97.     beq.s    Aspetta1x
  98.  
  99.     bsr.w    FadeIN        ; Fade!!!
  100.  
  101.     btst    #2,$dff016    ; mouse premuto?
  102.     bne.s    mouse2x
  103.  
  104.     move.w    #16,FaseDelFade    ; parti dal fotogramma 16
  105.  
  106. mouse3x:
  107.     CMP.b    #$ff,$dff006    ; linea 255
  108.     bne.s    mouse3x
  109. Aspetta2x:
  110.     CMP.b    #$ff,$dff006    ; linea 255
  111.     beq.s    Aspetta2x
  112.  
  113.     bsr.w    FadeOUT    ; Fade!!!
  114.  
  115.     btst    #6,$bfe001    ; mouse premuto?
  116.     bne.s    mouse3x
  117.  
  118.  
  119. ;    ****************+ parte 3 con tendenza al BLU *****************
  120.  
  121.     clr.w    FaseDelFade    ; azzera il numero del fotogramma
  122.     move.w    #$33c,Tendenza    ; imposta la tendenza al BLU ******
  123.  
  124. mouse2y:
  125.     CMP.b    #$ff,$dff006    ; linea 255
  126.     bne.s    mouse2y
  127. Aspetta1y:
  128.     CMP.b    #$ff,$dff006    ; linea 255
  129.     beq.s    Aspetta1y
  130.  
  131.     bsr.w    FadeIN        ; Fade!!!
  132.  
  133.     btst    #2,$dff016    ; mouse premuto?
  134.     bne.s    mouse2y
  135.  
  136.     move.w    #16,FaseDelFade    ; parti dal fotogramma 16
  137.  
  138. mouse3y:
  139.     CMP.b    #$ff,$dff006    ; linea 255
  140.     bne.s    mouse3y
  141. Aspetta2y:
  142.     CMP.b    #$ff,$dff006    ; linea 255
  143.     beq.s    Aspetta2y
  144.  
  145.     bsr.w    FadeOUT    ; Fade!!!
  146.  
  147.     btst    #6,$bfe001    ; mouse premuto?
  148.     bne.s    mouse3y
  149.  
  150.     rts
  151.  
  152.  
  153. *****************************************************************************
  154. ;    Routines che aspettano e richiamano Fade al momento giusto
  155. *****************************************************************************
  156.  
  157. FadeIn:
  158.     cmp.w    #17,FaseDelFade
  159.     beq.s    FinitoFadeIn
  160.     moveq    #0,d0
  161.     move.w    FaseDelFade(PC),d0
  162.     moveq    #15-1,d7        ; D7 = Numero di colori
  163.     lea    TabColoriPic(PC),a0    ; A0 = indirizzo tabella dei colori
  164.                     ; della figura da "dissolvere"
  165.     lea    CopColors+6,a1        ; A1 = indirizzo colori in copperlist
  166.                     ; da notare che parte dal COLOR1 e
  167.                     ; non dal color0, in quanto il color0
  168.                     ; e'=$000 e cosi' rimane.
  169.     bsr.s    Fade
  170.     addq.w    #1,FaseDelFade    ; sistema per la prossima volta la fase da fare
  171. FinitoFadeIn:
  172.     rts
  173.  
  174.  
  175. FadeOut:
  176.     tst.w    FaseDelFade    ; abbiamo superato l'ultima fase? (16)?
  177.     beq.s    FinitoOut
  178.     subq.w    #1,FaseDelFade    ; sistema per la prossima volta la fase da fare
  179.     moveq    #0,d0
  180.     move.w    FaseDelFade(PC),d0
  181.     moveq    #15-1,d7        ; D7 = Numero di colori
  182.     lea    TabColoriPic(PC),a0    ; A0 = indirizzo tabella dei colori
  183.                     ; della figura da "dissolvere"
  184.     lea    CopColors+6,a1        ; A1 = indirizzo colori in copperlist
  185.                     ; da notare che parte dal COLOR1 e
  186.                     ; non dal color0, in quanto il color0
  187.                     ; e'=$000 e cosi' rimane.
  188.     bsr.s    Fade
  189. FinitoOut:
  190.     rts
  191.  
  192. FaseDelFade:        ; fase attuale del fade (0-16)
  193.     dc.w    0
  194.  
  195. *****************************************************************************
  196. *        Routine per Fade In/Out da e verso il BIANCO            *
  197. * Input:                                    *
  198. *                                        *
  199. * d7 = Numero colori-1                                *
  200. * a0 = Indirizzo tabella con i colori della figura                *
  201. * a1 = Indirizzo primo colore in copperlist                    *
  202. * d0 = Momento del fade, multiplier - per esempio con d0=0 lo schermo        *
  203. *    e' bianco totalmente, con d0=8 siamo a meta' fade e con d0=16        *
  204. *    siamo ai colori pieni; dunque ci sono 17 fasi, dalla 0 alla 16.        *
  205. *    Per fare un fade IN, dal bianco al colore, si deve dare a ogni        *
  206. *    chiamata alla routine un valore di d0 crescente da 0 a 16        *
  207. *    Per un fade OUT, si dovra' partire da d0=16 fino a d0=0            *
  208. * d6 = colore da aggiungere al fade per dargli certe tonalita'            *
  209. *                                        *
  210. *  Il procedimento di FADE e' quello di moltiplicare ogni componente R,G,B  *
  211. *  del colore per un Multiplier, che va da 0 per il NERO (x*0=0), a 16 per  *
  212. *  i colori normali, dato che poi il colore viene diviso per 16,        *
  213. *  moltiplicare un colore per 16 e ridividerlo non fa che lasciarlo uguale. *
  214. *                                        *
  215. * La modifica consiste semplicemente nell'aggiungere le tonalita' in d6     *
  216. * e dividere il risultato per 2, per evitare di superare un totale di $f    *
  217. *                                        *
  218. *****************************************************************************
  219.  
  220. ;                   .-~~~-.
  221. ;                 /        }
  222. ;                /      .-~
  223. ;      \        |        }
  224. ;    ___\.~~-.-~|     .-~_
  225. ;       { O  |  `  -~      ~-._
  226. ;        ~--~/-|_\         .-~
  227. ;           /  |  \~ - - ~
  228. ;          /   |   \
  229.  
  230. Fade:
  231.     MOVE.W    Tendenza(PC),D6    ;    ; Maschera di tendenza RGB
  232. Fade1:
  233.     MOVE.W    D6,D1        ; copia col. tendenz. in d1
  234.     MOVE.W    D6,D2        ; in d2
  235.     MOVE.W    D6,D3        ; in d3
  236.     ANDI.W    #$00f,D1    ; SELEZ. SOLO BLUE
  237.     ANDI.W    #$0f0,D2    ; SELEZ. SOLO GREEN
  238.     ANDI.W    #$f00,D3    ; SELEZ. SOLO RED
  239.  
  240. ;    Calcola la componente BLU
  241.  
  242.     MOVE.W    (A0),D4        ; Metti il colore dalla tabella colori in d4
  243.     AND.W    #$00f,D4    ; Seleziona solo la componente blu ($RGB->$00B)
  244. ; modifica
  245.     ADD.W    D1,D4        ; Aggiungi la componente BLU di Tendenza
  246.     LSR.W    #1,D4        ; e dividi per 2 tramite uno shift di 1 bit a >
  247. ; fine modifica
  248.     MULU.W    D0,D4        ; Moltiplica per la fase del fade (0-16)
  249.     ASR.W    #4,D4        ; shift 4 BITS a destra, ossia divisione per 16
  250.     AND.W    #$00f,D4    ; Seleziona solo la componente BLU
  251.     MOVE.W    D4,D5        ; Salva la componente BLU in d5
  252.  
  253. ;    Calcola la componente VERDE (GREEN)
  254.  
  255.     MOVE.W    (A0),D4        ; Metti il colore dalla tabella colori in d4
  256.     AND.W    #$0f0,D4    ; Selez. solo la componente verde ($RGB->$0G0)
  257. ; modifica
  258.     ADD.W    D2,D4        ; Aggiungi la componente VERDE di Tendenza
  259.     LSR.W    #1,D4        ; e dividi per 2 tramite uno shift di 1 bit a >
  260. ; fine modifica
  261.     MULU.W    D0,D4        ; Moltiplica per la fase del fade (0-16)
  262.     ASR.W    #4,D4        ; shift 4 BITS a destra, ossia divisione per 16
  263.     AND.W    #$0f0,D4    ; Seleziona solo la componente VERDE
  264.     OR.W    D4,D5        ; Salva la comp.verde assieme a quella BLU
  265.  
  266.  
  267. ;    Calcola la componente ROSSA (RED)
  268.  
  269.     MOVE.W    (A0)+,D4    ; leggi il colore dalla tabella
  270.                 ; e fai puntare a0 al prossimo col.
  271.     AND.W    #$f00,D4    ; Selez. solo la componente rossa ($RGB->$R00)
  272. ; modifica
  273.     ADD.W    D3,D4        ; Aggiungi la componente ROSSA di Tendenza
  274.     LSR.W    #1,D4        ; e dividi per 2 tramite uno shift di 1 bit a >
  275. ; fine modifica
  276.     MULU.W    D0,D4        ; Moltiplica per la fase del fade (0-16)
  277.     ASR.W    #4,D4        ; shift 4 BITS a destra, ossia divisione per 16
  278.     AND.W    #$f00,D4    ; Selez. solo la componente rossa ($RGB->$R00)
  279.     OR.W    D4,D5        ; Salva la c. ROSSA assieme alla BLU e VERDE
  280.  
  281.     MOVE.W    D5,(A1)        ; E metti il colore $0RGB finale in copperlist
  282.     addq.w    #4,a1        ; prossimo colore in copperlist
  283.     DBRA    D7,Fade1    ; fai tutti i colori
  284.     rts
  285.  
  286.  
  287. Tendenza:
  288.     dc.w    0
  289.  
  290. ; il $180, color0, e' $000, dunque non cambia! La tabella parte dal color1
  291.  
  292. TabColoriPic:
  293.     dc.w $fff,$200,$310,$410,$620,$841,$a73
  294.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  295.  
  296.  
  297. *****************************************************************************
  298. ;            Copper List
  299. *****************************************************************************
  300.     section    copper,data_c        ; Chip data
  301.  
  302. Copperlist:
  303.     dc.w    $8E,$2c81    ; DiwStrt - window start
  304.     dc.w    $90,$2cc1    ; DiwStop - window stop
  305.     dc.w    $92,$38        ; DdfStart - data fetch start
  306.     dc.w    $94,$d0        ; DdfStop - data fetch stop
  307.     dc.w    $102,0        ; BplCon1 - scroll register
  308.     dc.w    $104,0        ; BplCon2 - priority register
  309.     dc.w    $108,0        ; Bpl1Mod - modulo pl. dispari
  310.     dc.w    $10a,0        ; Bpl2Mod - modulo pl. pari
  311.  
  312.             ; 5432109876543210
  313.     dc.w    $100,%0100001000000000    ; BPLCON0 - 4 planes lowres (16 colori)
  314.  
  315. ; Bitplane pointers
  316.  
  317. BPLPOINTERS:
  318.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  319.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  320.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  321.     dc.w $ec,$0000,$ee,$0000    ;quarto     bitplane
  322.  
  323. ; i primi 16 colori sono per il LOGO
  324.  
  325. CopColors:
  326.     dc.w $180,0,$182,0,$184,0,$186,0
  327.     dc.w $188,0,$18a,0,$18c,0,$18e,0
  328.     dc.w $190,0,$192,0,$194,0,$196,0
  329.     dc.w $198,0,$19a,0,$19c,0,$19e,0
  330.  
  331. ;    dc.w $180,$000,$182,$fff,$184,$200,$186,$310
  332. ;    dc.w $188,$410,$18a,$620,$18c,$841,$18e,$a73
  333. ;    dc.w $190,$b95,$192,$db6,$194,$dc7,$196,$111
  334. ;    dc.w $198,$222,$19a,$334,$19c,$99b,$19e,$446
  335.  
  336. ;    Mettiamo un poco di sfumature per la scenografia...
  337.  
  338.     dc.w    $8007,$fffe    ; Wait - $2c+84=$80
  339.     dc.w    $100,$200    ; bplcon0 - no bitplanes
  340.     dc.w    $180,$003    ; color0
  341.     dc.w    $8207,$fffe    ; wait
  342.     dc.w    $180,$005    ; color0
  343.     dc.w    $8507,$fffe    ; wait
  344.     dc.w    $180,$007    ; color0
  345.     dc.w    $8a07,$fffe    ; wait
  346.     dc.w    $180,$009    ; color0
  347.     dc.w    $9207,$fffe    ; wait
  348.     dc.w    $180,$00b    ; color0
  349.  
  350.     dc.w    $9e07,$fffe    ; wait
  351.     dc.w    $180,$999    ; color0
  352.     dc.w    $a007,$fffe    ; wait
  353.     dc.w    $180,$666    ; color0
  354.     dc.w    $a207,$fffe    ; wait
  355.     dc.w    $180,$222    ; color0
  356.     dc.w    $a407,$fffe    ; wait
  357.     dc.w    $180,$001    ; color0
  358.  
  359.     dc.l    $ffff,$fffe    ; Fine della copperlist
  360.  
  361.  
  362. *****************************************************************************
  363. ;                DISEGNO
  364. *****************************************************************************
  365.  
  366.     section    gfxstuff,data_c
  367.  
  368. ; Disegno largo 320 pixel, alto 84, a 4 bitplanes (16 colori).
  369.  
  370. Logo1:
  371.     incbin    'logo320*84*16c.raw'
  372.  
  373.     end
  374.  
  375. Questa e' una semplice modifica della routine precedente.
  376.  
  377.